perm filename NEIGHB.SAI[PIC,HE] blob
sn#430335 filedate 1979-04-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 entry neighb,neifnd
C00007 ENDMK
C⊗;
entry neighb,neifnd;
begin "neighb"
require "vislib.dcl" source!file;
require "⊂⊃<>" delimiters;
define notiming=⊂TRUE⊃;
source!l(saitim);
source!v(extitm);
source!V(murky.dcl);
internal procedure neifnd(integer ii,jj,ibuf,obuf; integer value;safe integer array neiarr);
begintim(neifndfollow,
<safe integer array neighbors[0:7];
integer k,l,m,n,initi,initj,p,oldval,rws,cols,ro,co,i,j,st,temp,tmp1,iind,jind,numpt,offi,offj;>)
rws←rows(ibuf); cols←colms(ibuf);
ro←rows(obuf); co←colms(obuf);
i←initi←ii; j←initj←jj;
offi←isubst(ibuf)-isubst(obuf);
offj←jsubst(ibuf)-jsubst(obuf);
st←0;
numpt←0;
IF (DUM←BDRPRE(N,I,J,IBUF,RWS,COLS,NEIGHBORS))≤0 THEN BLRETURN;
while true do
begin "loop"
temp←(n+st) mod 8;
i←i+icasev(temp);
j←j+jcasev(temp);
for m←0 thru 7 do
begin "ckloop"
tmp1←(m+st) mod 8;
iind←offi+i+icasev(tmp1);
jind←offj+j+jcasev(tmp1);
if 1≤iind≤ro ∧ 1≤jind≤co then
if 0 < (k←getpnt(iind,jind,obuf)) < value
then neiarr[k]←-1;
end;
putpnt(i+offi,j+offj,value,obuf);
if i=initi ∧ j=initj then done "loop";
bdrpost(n,st,temp,i,j,ibuf,rws,cols,neighbors);
end "loop";
endtim(neifndfollow);
internal procedure neighb(list regs1; string file; integer bigmsk);
begintim(neighb,
<string dev,masks;
string itemvar maskn,reg;
integer rowlim,collim,byts,picbuf,regbuf,flag,regmax,ii,jj,i,mr,mc,iptr;>)
dev←getdev(file,if bigmsk then "DAT" else "RED");
indmp(dev,file,picbuf←fndbuf,flag←0);
rowlim←rows(picbuf);
collim←colms(picbuf);
regmax←length(regs1)-1;
byts←0;
do byts←byts+1 until (2↑byts)>(regmax+1);
getbuf(rowlim,collim,byts,regbuf←fndbuf);
putsub(isubst(picbuf),jsubst(picbuf),regbuf);
frebuf(picbuf);
ifcr false thenc
for i←1 thru regmax do
begin
reg←dregfnd(i,regs1,flag);
if dmask⊗reg≡BIND maskn
∧ (ddescendants⊗reg =NIL)
then begin
outstr("Border for: "&datum(reg)&crlf);
dev←getdev(masks←datum(maskn),if bigmsk then "BIG" else "MSK");
indmp(dev,masks,picbuf←fndbuf,flag←-2);
if flag then continue;
mr←rows(picbuf);
mc←colms(picbuf);
uptoval(ii←1,jj←1,1,picbuf);
border(ii,jj,picbuf,regbuf,0,0,0,0,-i);
frebuf(picbuf);
end;
end;
endc
begintim(Get Neighbors,
<safe integer array neiarr[0:2↑bytsz(regbuf)];>)
for i←1 thru regmax do
begin "finlop"
reg←dregfnd(i,regs1,flag);
if dmask⊗reg≡BIND maskn
∧ (ddescendants⊗reg =NIL)
then begin "callop"
outstr("Neighbors for: "&datum(reg)&crlf);
dev←getdev(masks←datum(maskn),if bigmsk then "BIG" else "MSK");
indmp(dev,masks,picbuf←fndbuf,flag←-2);
if flag then continue;
mr←rows(picbuf);
mc←colms(picbuf);
uptoval(ii←1,jj←1,1,picbuf);
arrclr(neiarr);
neifnd(ii,jj,picbuf,regbuf,i,neiarr);
frebuf(picbuf);
for ii←1 thru i-1 do
if neiarr[ii]
then begin
dadd(dneighbor,reg,dregfnd(ii,regs1,flag));
dadd(dneighbor,dregfnd(ii,regs1,flag),reg);
end;
end;
end;
endtim(Get Neighbors);
frebuf(regbuf);
endtim(neighb);
end "neighb";